import os
import shutil


def copy_py_files(source_dir, target_dir):
    """
    拷贝源目录及其子目录中的所有.py文件到目标目录，保持目录结构

    :param source_dir: 源目录路径
    :param target_dir: 目标目录路径
    """
    # 确保目标目录存在
    # target_dir：要创建的目录路径（可以是绝对路径或相对路径）
    # exist_ok：布尔值参数（默认为 False）
    # True：如果目录已存在，不会报错
    # False：如果目录已存在，会抛出 FileExistsError 异常
    os.makedirs(target_dir, exist_ok=True)


    # os.walk() 是一个生成器函数，它会递归遍历指定目录及其所有子目录，为每个目录生成一个三元组 (root, dirs, files)。
    # 2. 返回值解析
    # 每次迭代返回的三元组包含：
    # root	字符串	当前正在遍历的目录路径（绝对路径/相对路径）
    # dirs	列表	    当前目录下的所有子目录名（不包括路径）
    # files	列表	    当前目录下的所有文件名（不包括路径）

    for root, dirs, files in os.walk(source_dir):
        for file in files:
            if file.endswith('.py'):
                source_file = os.path.join(root, file)
                # 计算相对路径以保持目录结构
                relative_path = os.path.relpath(root, source_dir)
                target_path = os.path.join(target_dir, relative_path)

                # 确保目标子目录存在
                os.makedirs(target_path, exist_ok=True)

                # 拷贝文件
                target_file = os.path.join(target_path, file)
                shutil.copy2(source_file, target_file)
                print(f"Copied: {source_file} -> {target_file}")


# 使用示例
source_directory = r'D:\source_python'  # 替换为你的源目录
target_directory =  r'D:\dis_python' # 替换为目标目录

copy_py_files(source_directory, target_directory)
print("所有.py文件拷贝完成！")